﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spiders
{
    static class Extensions
    {
        /// <summary>
        /// 模拟Javascript中的Date.getTime()方法，返回从dt表示时间距1970年1月1日午夜之间的毫秒数
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static long GetTime(this DateTime dt)
        {
            // 必须为UTC时间（Javascript中是相对于GMT时间来计算）
            DateTime utc = dt.ToUniversalTime();
            // 种子时间：1970年1月1日
            DateTime seed = new DateTime(1970, 1, 1).ToUniversalTime();

            TimeSpan span = new TimeSpan(utc.Ticks - seed.Ticks);
            return (long)span.TotalMilliseconds;
        }

        /// <summary>
        /// 模拟Javascript中的charCodeAt()方法
        /// </summary>
        /// <param name="s"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public static int CharCodeAt(this String s, int index)
        {
            if (index > s.Length - 1)
            {
                throw new IndexOutOfRangeException("索引超出范围");
            }
            byte[] bytes = Encoding.Default.GetBytes(s);
            return bytes[index];
        }

        /// <summary>
        /// 模拟Javascript中的splice()方法
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="index"></param>
        /// <param name="howmany"></param>
        /// <returns>返回被删除元素组成的数组</returns>
        public static int[] Splice(this int[] arr, int index, int howmany)
        {
            if (howmany == 0)
            {
                return null;
            }
            if (Math.Abs(index) > arr.Length)
            {
                return null;
            }
            int length = arr.Length;
            int[] newArray = new int[howmany];

            if (index >= 0)
            {
                Array.Copy(arr, index, newArray, 0, howmany);
            }
            else
            {
                Array.Copy(arr, length - Math.Abs(index), newArray, 0, howmany);
            }
            return newArray;
        }
    }
}
